package com.wynet.shopsapp.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.wynet.shopsapp.dao.SmsDao;
import com.wynet.shopsapp.dao.UserDao;
import com.wynet.shopsapp.dto.PhoneCodeDto;
import com.wynet.shopsapp.entity.Sms;
import com.wynet.shopsapp.entity.User;
import com.wynet.shopsapp.service.intf.SmsService;
import com.wynet.shopsapp.util.AliSmsUtil;
import com.wynet.shopsapp.util.JedisUtil;
import com.wynet.shopsapp.vo.R;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import java.util.Date;


@Service
public class SmsServiceImpl implements SmsService {
    @Resource
    private SmsDao dao;
    @Resource
    private UserDao userDao;
    /**
     * 1.发送注册的验证码*/
    @Override
    public R sendRegisterCode(String phone) {
       return sendCode(phone,"register","注册");
    }

    /**
     * 封装 验证码发送
     * @param phone 手机号
     * @param key  Redis的key
     * @param name 功能名*/
    private R sendCode(String phone,String key,String name){
        //1.参数校验
        if(StringUtils.hasLength(phone)) {
            //2.手机号 正则校验 符合手机号格式
            if (phone.matches("^1[3456789]\\d{9}$")) {

                //3.发送短信验证码  验证码 6位 有效期10分钟

                //生成随机6位的验证码
                int code= AliSmsUtil.createCode(6);
                System.err.println("验证码："+code);
                //发送并验证发送结果
                if(true){//为了Money 假的发送
//                if(AliSmsUtil.sendSms(phone,code)){

                    //4.发送成功 记录验证码
                    //考虑使用Redis 有效期10分钟  String类型，有效期 存储：key 手机号 值 验证码
                    JedisUtil.addStr("auth:"+key+":"+phone,code+"",600);

                    //5.记录 发送 到数据库
                    dao.insert(new Sms(1,phone,"发送"+name+"验证码成功",new Date()));

                    //6.返回
                    return R.ok();
                }
            }
        }
        return R.fail("亲，验证码发送失败！");
    }
    @Override
    public R sendLoginCode(String phone) {
        return sendCode(phone,"login","登录");
    }

    @Override
    public R checkRegiterCode(PhoneCodeDto dto) {
        //1.参数校验
        if(dto!=null){
            if(StringUtils.hasLength(dto.getPhone())){
                //2.校验 是否存在验证码
                if(JedisUtil.existsKey("auth:register:"+dto.getPhone())){
                    //3.存在  验证 验证码是否正确
                    if(JedisUtil.getStr("auth:register:"+dto.getPhone()).equals(dto.getCode())){
                        // 验证码正确
                        //4.删除验证码
                        JedisUtil.delKeys("auth:register:"+dto.getPhone());
                        //5.记录一下，校验过的手机号 存储Redis Set类型：唯一
                        JedisUtil.addSet("auth:checkphones",dto.getPhone());

                        return R.ok();
                    }
                }else {
                    return R.fail("亲，验证码已失效！");
                }
            }
        }
        return R.fail("亲，验证码不正确！");
    }

    @Override
    public R sendFindCode(String phone) {
        //1.查询 是否存在对应的手机号
        if(userDao.selectOne(new QueryWrapper<User>().eq("phone",phone))!=null){
            //2.发送短信验证码
            return sendCode(phone,"find","密码找回");
        }
        return R.fail("亲，您还没注册呢！");
    }

    @Override
    public R all() {
        return R.ok(dao.selectList(null));
    }
}
